//
//  EmoticonViewController.swift
//  emotion
//
//  Created by 张衡 on 15/8/9.
//  Copyright © 2015年 张衡. All rights reserved.
//

import UIKit





// collectionView 的cell 的 重用标示符
private let ZHEmoticonCellIdentifier = "ZHEmoticonCellIdentifier"

// 用了控制器的view，做textView 的InputView ,在往里面添加 toolbar，和collectionView实现表情键盘的左右滑动

// 新建一个文件夹，要把东西都写在这里面，方便后来直接拖走移植；




// 这是一个表情键盘输入控制器，其view 为 textView 的 inputView
class EmoticonViewController: UIViewController {
    
    
    // 定义一个选择表情的闭包,两种解决方法，第一设成可选项，第二构造函数中初始化
    var selecteEmoticonCallBack: (emoticon: Emoticon) -> ()
    
    // MARK: - 构造函数
    init(seletedEmoticon: (emoticon: Emoticon) -> ()) {
        // 1. 记录闭包，构造函数中初始化
        selecteEmoticonCallBack = seletedEmoticon
        
        // 2. 调用指定构造函数
        super.init(nibName: nil, bundle: nil)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    
    
    // MARK: - 监听方法
    // 选中工具栏按钮  // addTarget: 自己就是参数
    func clickItem(item: UIBarButtonItem) {
        // print(item.tag)
        
        let indexPath = NSIndexPath(forItem: 0, inSection: item.tag)
        
        // collectionView 滚到指定位置
        collectionView.scrollToItemAtIndexPath(indexPath, atScrollPosition: UICollectionViewScrollPosition.Left, animated: true)
    }
    

    
    override func viewDidLoad() {
        super.viewDidLoad()
        // 可以添加界面，改变view的内容，
        // view.backgroundColor = UIColor.blueColor()
        // print(view) // 懒加载指定textView的inputview，显示之前，这里大小还是375 ，667
        
        setupUI()

    }
    
    
    
    override func viewDidAppear(animated: Bool) {
        
//        print(view) // 触动textView 后显示该view，大小变为键盘大小375 216
    }

    
    
    // MARK: - 搭建界面
    func setupUI() {
        
        view.addSubview(toolBar)
        view.addSubview(collectionView)
        
        // 自动布局， 开发相对独立的程序或应用框架是，最好不要用其他框架
        
//        NSLayoutConstraint(item: <#T##AnyObject#>,
//            attribute: NSLayoutAttribute.Leading,
//            relatedBy: NSLayoutRelation.Equal,
//            toItem: <#T##AnyObject?#>,
//            attribute: <#T##NSLayoutAttribute#>,
//            multiplier: <#T##CGFloat#>,
//            constant: <#T##CGFloat#>)
        // 约束添加到父控件上, 苹果原生的vlf
        collectionView.translatesAutoresizingMaskIntoConstraints = false
        toolBar.translatesAutoresizingMaskIntoConstraints = false
        let viewDict = ["cv": collectionView, "tb": toolBar]
        //view.addConstraint(NSLayoutConstraint.constraintsWithVisualFormat("H: |-0-[cv]-0-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: viewDict))
        // 一个加s 一个不加s
        view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-0-[cv]-0-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: viewDict))
        view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-0-[tb]-0-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: viewDict))
        view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-0-[cv]-0-[tb(44)]-0-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: viewDict))
        
        
        prepareToolBar()
        prepareCollectionView()
    }
    
    
    // 准备collectionView
    private func prepareCollectionView() {
        
        // 创建之初指定布局形式，接下来要注册自己item 要用的cell
        collectionView.registerClass(EmoticonCell.self, forCellWithReuseIdentifier: ZHEmoticonCellIdentifier)
        
        collectionView.backgroundColor = UIColor.whiteColor()
        
        collectionView.dataSource = self
        
        // 两个地方设置翻页功能都可以
//        collectionView.pagingEnabled = true
        
        // 用代理监听选择
        collectionView.delegate = self
        
        
    }
    

    
    // 准备工具栏
    private func prepareToolBar() {
        
        var items = [UIBarButtonItem]()
        var index = 0
        
        for p in packages {
            // 加按钮
            items.append(UIBarButtonItem(title: p.groupName, style: UIBarButtonItemStyle.Plain, target: self, action: "clickItem:"))
            items.last?.tag = index++
            // 加弹簧
            items.append(UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: nil, action: nil))
        }
        
        items.removeLast()
        toolBar.items = items
        toolBar.tintColor = UIColor(white: 0.4, alpha: 1)
    }

    
    
    
    // MARK : - 懒加载控件
    private lazy var toolBar: UIToolbar = UIToolbar()
    // 创建之初就要指定布局形式,要是指定成基类的flowLayout就不显示了
    private lazy var collectionView: UICollectionView = UICollectionView(frame: CGRectZero, collectionViewLayout: ZHEmoticonLayout())
    
    /// 3个表情包数据 + 最近表情
    private lazy var packages = EmoticonPackage.packages  // 避免重复加载

    
    
    // 类里面在写一个布局类，swift是允许的,类中类，私有类
    private class ZHEmoticonLayout: UICollectionViewFlowLayout {
        
        // The collection view calls -prepareLayout once at its first layout as the first message to the layout instance.
        // The collection view calls -prepareLayout again after layout is invalidated and before requerying the layout information.
        // Subclasses should always call super if they override.
        private override func prepareLayout() {
            
            // print(collectionView) // 本类带有此属性，既需要布局的collectionView
            
            // 统一设置布局属性（属性都在 UICollectionViewFlowLayout 类中）
            let w = collectionView!.bounds.width / 7
            
            // 提示由于浮点数计算问题，0.5 在iphone 4s 的模拟器只能显示2行
            let y = (collectionView!.bounds.height - 3 * w) * 0.499
            
            itemSize = CGSize(width: w, height: w)
            minimumLineSpacing = 0
            minimumInteritemSpacing = 0
            
            sectionInset = UIEdgeInsets(top: y, left: 0, bottom: y, right: 0)
            
            scrollDirection = UICollectionViewScrollDirection.Horizontal
            
            collectionView?.pagingEnabled = true
            
            collectionView?.showsHorizontalScrollIndicator = false
            
            // collectionView?.bounces = false
        }
    }
}



// 延展，写全部的数据源方法
extension EmoticonViewController: UICollectionViewDataSource, UICollectionViewDelegate {
    
    
    func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
        
        // 1. 获取到选择到的表情 ,cell 中填充的是button，button把交互拦截了，所以要设置button不交互
        let emoticon = packages[indexPath.section].emoticons![indexPath.item]
        
        // 2. 完成回调
        selecteEmoticonCallBack(emoticon: emoticon)
        
        // 3. 添加最近表情， 如果用户使用的是最近表情就不参加排序
        if indexPath.section > 0 {
            EmoticonPackage.addFavourite(emoticon)
        
        }
        // 如果刷新的话，就会出现新选的表情出现在后边（再没有定死21前）
        // collectionView.reloadData()
        // 4. 刷新最近
        // 用户体验： 界面会闪动。表情位置发生变化乱窜
        // collectionView.reloadSections(NSIndexSet(index: 0))
        
    }
    
    
 // 数据源方法，如果没有 collectionView.reloadData() 翻动时只会调用第三个方法
    // 一个表情包对应一个section
    func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
//        print("共有 \(packages.count) 组表情")
        return packages.count
        
    }
    
    // 每个表情包的表情数量
    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
//        print("表情数量 :\(packages[section].emoticons!.count)")
        return packages[section].emoticons!.count ?? 0
        
    }
    
    // cell具体内容
    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier(ZHEmoticonCellIdentifier, forIndexPath: indexPath) as! EmoticonCell
        
//        print(indexPath)  section + item
//        print(indexPath.item)  item
        
        //cell.backgroundColor = UIColor.whiteColor() // (indexPath.item % 2 == 0) ? UIColor.darkGrayColor() : UIColor.lightGrayColor()
        
//        print("来了\(indexPath.item)")
        cell.emoticon = packages[indexPath.section].emoticons![indexPath.item]
        
        return cell
    }
}




// 私有类
// 表情 cell，collectionview 中的 items 用的cell
private class EmoticonCell: UICollectionViewCell {
    
    
    // 表情属性
    var emoticon: Emoticon? {
        
        didSet {
            
            // 设置按钮图像
            // contentOfFile 如果路径不存在会返回"" 空 , setimage 会清空按钮图片
            emoticonButton.setImage(UIImage(contentsOfFile: emoticon!.imagePath), forState: UIControlState.Normal)
            
            emoticonButton.setImage(nil, forState: UIControlState.Highlighted)
            
        
//            // 常规写法，考虑到cell的复用，每次调用过来的时候，都要给内容设置一下，否则会复用上次的内容，如果没有内容就设置nil ，把代码放到最应该放的地方
            
            
//            if emoticon!.chs != nil {
//                emoticonButton.setImage(UIImage(contentsOfFile: emoticon!.imagePath), forState: UIControlState.Normal)
//            } else {
//                emoticonButton.setImage(nil, forState: UIControlState.Normal)
//            }
            
            
            // 设置emoji
            emoticonButton.setTitle(emoticon!.emoji, forState: UIControlState.Normal)
            
            
            // 判断是不是删除按钮
            if emoticon!.removeEmoticon {
                emoticonButton.setImage(UIImage(named: "compose_emotion_delete"), forState: UIControlState.Normal)
                emoticonButton.setImage(UIImage(named: "compose_emotion_delete_highlighted"), forState: UIControlState.Highlighted)
            }
            
        }
    }

    // 提示 frame 已经有准确的数值，因为已经flowLayout好了
    override init(frame: CGRect) {
        
        super.init(frame: frame)
        
        addSubview(emoticonButton)
        
        emoticonButton.backgroundColor = UIColor.whiteColor() // UIColor.orangeColor()
        emoticonButton.frame = CGRectInset(bounds, 4, 4) // bounds 注意缩进的小函数
        emoticonButton.titleLabel?.font = UIFont.systemFontOfSize(32)
        emoticonButton.userInteractionEnabled = false
        
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    // 懒加载，控件
    private lazy var emoticonButton = UIButton()
    
}
